package com.cardone.platform.common.dao;

import java.util.List;
import java.util.Map;

import com.cardone.common.cache.support.CacheEvictSupport;
import com.cardone.common.dto.PaginationDto;
import com.cardone.platform.common.dto.EntityLogDto;

/**
 * 实体日志
 * 
 * @author yaoht
 * 
 */
public interface EntityLogDao extends CacheEvictSupport {
	/**
	 * spring bean id
	 */
	String BEAN_ID = "com.cardone.platform.common.dao.EntityLogDao";

	/**
	 * sql标识
	 * 
	 * @author yaoht
	 * 
	 */
	public enum SqlIds {
		/**
		 * 删除
		 */
		deleteByCode,

		/**
		 * 删除
		 */
		deleteByIds,

		/**
		 * 查询
		 */
		findByCode,

		/**
		 * 查询
		 */
		findByName,

		/**
		 * 插入
		 */
		insertByCode,

		/**
		 * 插入
		 */
		insertByName,

		/**
		 * 读取
		 */
		readByCode,

		/**
		 * 读取
		 */
		readByName,

		/**
		 * 更新
		 */
		updateByCode,

		/**
		 * 更新
		 */
		updateByIds;

		/**
		 * 根目录
		 */
		private static final String ROOT = "/platform/common/entityLog/";

		/**
		 * 标识
		 */
		private final String id;

		/**
		 * sql标识
		 */
		private SqlIds() {
			this.id = SqlIds.ROOT + this.name();
		}

		/**
		 * 获取
		 * 
		 * @return sql标识
		 */
		public String id() {
			return this.id;
		}
	}

	/**
	 * 实体属性
	 * 
	 * @author yaoht
	 * 
	 */
	public enum DtoAttributes {
		/**
		 * 实体标识
		 */
		entityId,

		/**
		 * 标识
		 */
		ids,

		/**
		 * 消息
		 */
		message,

		/**
		 * 操作时间
		 */
		operatorDate,

		/**
		 * 用户.用户标识
		 */
		userId;
	}

	/**
	 * 插入
	 * 
	 * @param insertEntityLog
	 *            实体日志对象
	 * 
	 * @param insertProperties
	 *            插入属性名集合
	 * 
	 * @return 影响行数
	 */
	int insertByCode(EntityLogDto insertEntityLog, String... insertProperties);

	/**
	 * 插入
	 * 
	 * @param insertEntityLog
	 *            实体日志对象
	 * 
	 * @return 影响行数
	 */
	int insertByCodeOrId(EntityLogDto insertEntityLog);

	/**
	 * 插入
	 * 
	 * @param insertEntityLog
	 *            实体日志对象
	 * 
	 * @return 影响行数
	 */
	int insertByName(EntityLogDto insertEntityLog);

	/**
	 * 删除
	 * 
	 * @param deleteEntityLog
	 *            实体日志对象
	 * 
	 * @param whereAndEqProperties
	 *            条件为等于的属性名集合
	 * 
	 * @return 影响行数
	 */
	int deleteByCode(EntityLogDto deleteEntityLog, String... whereAndEqProperties);

	/**
	 * 删除
	 * 
	 * @param deleteEntityLog
	 *            实体日志对象
	 * 
	 * @return 影响行数
	 */
	int deleteByCodeOrId(EntityLogDto deleteEntityLog);

	/**
	 * 删除
	 * 
	 * @param deleteEntityLog
	 *            实体日志对象
	 * 
	 * @return 影响行数
	 */
	int deleteByIds(EntityLogDto deleteEntityLog);

	/**
	 * 更新
	 * 
	 * @param updateEntityLog
	 *            实体日志对象
	 * 
	 * @param updateProperties
	 *            更新的属性名集合
	 * 
	 * @param whereAndEqProperties
	 *            条件为等于的属性名集合
	 * 
	 * @return 影响行数
	 */
	int updateByCode(EntityLogDto updateEntityLog, String[] updateProperties, String... whereAndEqProperties);

	/**
	 * 更新
	 * 
	 * @param updateEntityLog
	 *            实体日志对象
	 * 
	 * @return 影响行数
	 */
	int updateByCodeOrId(EntityLogDto updateEntityLog);

	/**
	 * 更新
	 * 
	 * @param updateEntityLog
	 *            实体日志对象
	 * 
	 * @return 影响行数
	 */
	int updateByIds(EntityLogDto updateEntityLog);

	/**
	 * 查询
	 * 
	 * @param requiredType
	 *            返回类型
	 * 
	 * @param objectId
	 *            返回对象标识
	 * 
	 * @param readEntityLog
	 *            实体日志对象
	 * 
	 * @param whereAndEqProperties
	 *            条件为等于的属性名集合
	 * 
	 * @return 返回对象
	 */
	<R> R readByCode(Class<R> requiredType, String objectId, EntityLogDto readEntityLog, String... whereAndEqProperties);

	/**
	 * 查询
	 * 
	 * @param requiredType
	 *            返回类型
	 * 
	 * @param objectId
	 *            返回对象标识
	 * 
	 * @param readEntityLog
	 *            实体日志对象
	 * 
	 * @return 返回对象
	 */
	<R> R readByCodeOrId(Class<R> requiredType, String objectId, EntityLogDto readEntityLog);

	/**
	 * 查询
	 * 
	 * @param requiredType
	 *            返回类型
	 * 
	 * @param objectId
	 *            返回对象标识
	 * 
	 * @param readEntityLog
	 *            实体日志对象
	 * 
	 * @return 返回对象
	 */
	<R> R readByName(Class<R> requiredType, String objectId, EntityLogDto readEntityLog);

	/**
	 * 查询
	 * 
	 * @param requiredType
	 *            返回类型
	 * 
	 * @param objectId
	 *            返回对象标识
	 * 
	 * @param readListEntityLog
	 *            实体日志对象
	 * 
	 * @param whereAndEqProperties
	 *            条件为等于的属性名集合
	 * 
	 * @return 实体日志对象集合
	 */
	<R> List<R> readListByCode(Class<R> requiredType, String objectId, EntityLogDto readListEntityLog, String... whereAndEqProperties);

	/**
	 * 查询
	 * 
	 * @param requiredType
	 *            返回类型
	 * 
	 * @param objectId
	 *            返回对象标识
	 * 
	 * @param readListEntityLog
	 *            实体日志对象
	 * 
	 * @return 实体日志对象集合
	 */
	<R> List<R> readListByCodeOrId(Class<R> requiredType, String objectId, EntityLogDto readListEntityLog);

	/**
	 * 查询
	 * 
	 * @param requiredType
	 *            返回类型
	 * 
	 * @param objectId
	 *            返回对象标识
	 * 
	 * @param readListEntityLog
	 *            实体日志对象
	 * 
	 * @return 实体日志对象集合
	 */
	<R> List<R> readListByName(Class<R> requiredType, String objectId, EntityLogDto readListEntityLog);

	/**
	 * 查询
	 * 
	 * @param mappedClass
	 *            返回类型
	 * 
	 * @param findEntityLog
	 *            实体日志对象
	 * 
	 * @param selectProperties
	 *            查询的属性名集合
	 * 
	 * @param whereAndEqProperties
	 *            条件为等于的属性名集合
	 * 
	 * @return 返回对象
	 */
	<P> P findByCode(Class<P> mappedClass, EntityLogDto findEntityLog, String[] selectProperties, String... whereAndEqProperties);

	/**
	 * 查询
	 * 
	 * @param mappedClass
	 *            返回类型
	 * 
	 * @param findEntityLog
	 *            实体日志对象
	 * 
	 * @return 返回对象
	 */
	<P> P findByCodeOrId(Class<P> mappedClass, EntityLogDto findEntityLog);

	/**
	 * 查询
	 * 
	 * @param mappedClass
	 *            返回类型
	 * 
	 * @param findEntityLog
	 *            实体日志对象
	 * 
	 * @return 返回对象
	 */
	<P> P findByName(Class<P> mappedClass, EntityLogDto findEntityLog);

	/**
	 * 查询
	 * 
	 * @param requiredType
	 *            返回类型
	 * 
	 * @param readEntityLog
	 *            实体日志对象
	 * @return 返回数据
	 */
	<R> R readByCodeNqId(Class<R> requiredType, EntityLogDto readEntityLog);

	/**
	 * 查询
	 * 
	 * @param mappedClass
	 *            返回类型
	 * 
	 * @param findListEntityLog
	 *            实体日志对象
	 * 
	 * @param selectProperties
	 *            查询的属性名集合
	 * 
	 * @param whereAndEqProperties
	 *            条件为等于的属性名集合
	 * 
	 * @return 实体日志对象集合
	 */
	<P> List<P> findListByCode(Class<P> mappedClass, EntityLogDto findListEntityLog, String[] selectProperties,
	        String... whereAndEqProperties);

	/**
	 * 查询
	 * 
	 * @param mappedClass
	 *            返回类型
	 * 
	 * @param findListEntityLog
	 *            实体日志对象
	 * 
	 * @return 实体日志对象集合
	 */
	<P> List<P> findListByCodeOrId(Class<P> mappedClass, EntityLogDto findListEntityLog);

	/**
	 * 查询
	 * 
	 * @param mappedClass
	 *            返回类型
	 * 
	 * @param findListEntityLog
	 *            实体日志对象
	 * 
	 * @return 实体日志对象集合
	 */
	<P> List<P> findListByName(Class<P> mappedClass, EntityLogDto findListEntityLog);

	/**
	 * 分页
	 * 
	 * @param mappedClass
	 *            返回类型
	 * 
	 * @param paginationEntityLog
	 *            实体日志对象
	 * 
	 * @return 实体日志分页对象
	 */
	<P> PaginationDto<P> paginationByCode(Class<P> mappedClass, EntityLogDto paginationEntityLog);

	/**
	 * 分页
	 * 
	 * @param paginationEntityLog
	 *            实体日志对象
	 * 
	 * @return 实体日志分页对象
	 */
	PaginationDto<Map<String, Object>> paginationByName(EntityLogDto paginationEntityLog);
}